package cn.ccccltd.waf.id_generator.config.exception;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.WebRequest;

import cn.ccccltd.waf.id_generator.config.model.ResultData;

/**
 * 创建日期:2018年3月28日
 * Title:异常处理类
 * Description：对本文件的详细描述，原则上不能少于50字
 * @author yangjingjiang
 * @mender：（文件的修改者，文件创建者之外的人）
 * @version 1.0
 * Remark：认为有必要的其他信息
 */
@ControllerAdvice
public class WebExceptionHandler {

	@ExceptionHandler(Exception.class)
	@ResponseBody
	public ResultData messageError(final Exception e, final WebRequest req){
		
		//打印错误日志
		e.printStackTrace();
		
		ResultData rs = new ResultData(false, HttpStatus.INTERNAL_SERVER_ERROR.toString(), e.getMessage(), getExceptionStackTrace(e));
		
		return rs;
		
	}
	
	/**
	 * 功能: 获取异常详细<br>
	 * 作者: yangjingjiang <br>
	 * 创建日期:2018年3月28日 <br>
	 * 修改者: mender <br>
	 * 修改日期: modifydate <br>
	 * @param e
	 * @return
	 */
	public static String getExceptionStackTrace(Exception e) {

		StringWriter sw = null;
		PrintWriter pw = null;

		try {
			sw = new StringWriter();
			pw = new PrintWriter(sw);

			// 将出错的栈信息输出到printWriter中
			e.printStackTrace(pw);

			pw.flush();
			sw.flush();

		} finally {
			if (sw != null) {
				try {
					sw.close();
				} catch (IOException ioe) {
					ioe.printStackTrace();
				}
			}
			if (pw != null) {
				pw.close();
			}
		}
		
		return (sw == null) ? "" : "<pre>" + sw.toString().replaceAll("\r\n", "<br>") + "</pre>";
	}
	
}
